<?php
class User_dao extends Base_dao
{
	private $clave_enc = 'Lk12398sdF8s6ga0sdjlk2I09';

	public function __construct()
	{
		parent::__construct();
		
		$this->nombreTabla = 'user';
		$this->nombreColumnaID = 'id';
		$this->nombreModelo = 'User_dto';
		
		$this->load->model('Rol_user_dao', 'Rol_user_dao');
	}
	
	public function guardar($objUserDTO)
	{	
		// Las password se guardan encriptadas. Las password originales tienen como máximo, 9 caracteres.
		// Si la password ya estuviese encriptada, no la vuelvo a encriptar para guardar sino que la dejo
		// como está (y su longitud es aprox 2,6 veces mayor que la original)
		if(strlen($objUserDTO->password) < 10) {
			// Antes de guardar la información del usuario, encripto la clave
			//Libreria para encriptar la clave
			$this->load->library('encriptar');
			$objUserDTO->password = $this->encriptar->encrypt($objUserDTO->password, $this->clave_enc);
		}

		// Controlar si guarda bien, ya que se está llamando al método padre
		$result = parent::guardar($this->nombreTabla, $this->nombreColumnaID, $objUserDTO, $objUserDTO->id);
		
		if($result['exito'])
		//if (($objUserDTO->id == 0 && $operacionExitosa > 0) || $operacionExitosa)
		{
			if ($objUserDTO->id == 0) $objUserDTO->id = $result['idGenerado'];
			
			// Guardado el usuario, debo guardar sus roles
			foreach($objUserDTO->getRoles() as $rolUser)
			{
				// Debo guardar la relación entre el Usuario y el Rol.
				$rolUser->idUser = $objUserDTO->id;
				$this->Rol_user_dao->guardar($rolUser);
			}
		}
		
		return $result;
	}
	
	
	public function borrar($idUser)
	{
		// En primer lugar debo borrar de la tabla intermedia, todos los registros que asocien el usuario actual
		// a los roles
		$result = $this->Rol_user_dao->eliminarPorUsuario($idUser);
		if($result['exito'])
		{
			$result = parent::borrar($this->nombreTabla, $this->nombreColumnaID, $idUser);	
		}
		
		return $result;
	}
	

	public function loginCorrecto($usuario, $password)
	{
		// Antes de realizar la comparación, encripto la clave enviada para comparar en igualdad de condiciones
		$this->load->library('encriptar');
		$password = $this->encriptar->encrypt($password, $this->clave_enc);
				
		$condiciones = array('email' 	=> "$usuario",
							 'password'	=>	"$password",
							 'deBaja'	=>	0
							 );
		$limite = 1;

		$consulta = $this->obtenerObjetos($condiciones, $limite);
		if (sizeof($consulta) == 1) {
			$objUserDTO = $consulta[0];
			if($objUserDTO->id != 0) {
					$objRol = $objUserDTO->getPrimerRol();
					
					$resultado['validUser'] = TRUE;
					$resultado['name'] = $objUserDTO->firstName . ' ' . $objUserDTO->lastName;
					$resultado['rol'] = $objRol->name;
					$resultado['permissions'] = $this->getPermissions($objRol->id);
					$resultado['idUser'] = $objUserDTO->id;
					$resultado['email'] = $objUserDTO->email;
			}
			else {
				$resultado['validUser'] = FALSE;
			}
		}
		else $resultado['validUser'] = FALSE;
		
		return $resultado;
	}
	
	public function getPermissions($idRol)
	{
		$arreglo = array();
		
		$this->db->select('function');
		$this->db->where('rol', "$idRol");
		$consulta = $this->db->get('permission');
		
		if ($consulta->num_rows() > 0)
		{
			$indice = 0;
			foreach ($consulta->result() as $row)
			{
				$arreglo[$indice] = $row->function;
				$indice++;
			}
		}
		return $arreglo;
	}
	
	public function existeNombreUsuario($usuario, $idUser)
	{
		$condiciones = array('email' => "$usuario", 
							 "$this->nombreColumnaID !=" => $idUser);
		$limite = 1;
		
		$consulta = $this->obtenerDatos($condiciones, $limite);
		if (sizeof($consulta) == 1) {
			 return TRUE;
		}
		else return FALSE;
	}
	
	public function obtenerDatos($condiciones = array(), $crearObjetos = false, $limite = 0, $camposSelect = '')
	{	
		return parent::obtenerDatos($this->nombreTabla, $this->nombreModelo, $condiciones, $crearObjetos, $limite, $camposSelect);
	}
	
	public function obtenerObjetos($condiciones = array(), $limite = 0)
	{
		return $this->obtenerDatos($condiciones, true, $limite);
	}
	
	public function obtenerObjetoPorID($idBuscado)
	{
		$obj = parent::obtenerObjetoPorID($this->nombreTabla, $this->nombreColumnaID, $this->nombreModelo, $idBuscado);
		if($obj == NULL) $obj = new User_dto();
		
		return $obj;
	}
	
	public function obtenerMails()
	{
		$mailsUsers = $this->obtenerDatos(array('deBaja' => 0), FALSE, 0, 'email');
		$mails_usuarios = array();
		
		foreach($mailsUsers as $mail)
		{
			$mails_usuarios[] = $mail->email;
		}
		return $mails_usuarios;
	}
	
	public function obtenerEnabledUsers()
	{
		return $this->obtenerDatos(array('deBaja' => 0), true);
	}

	public function encriptarDato($dato)
	{
		$this->load->library('encriptar');
		return $this->encriptar->encrypt($dato, $this->clave_enc);
	}
}